iT邦幫忙

1

[ 猩猩也會用 ] YAML檔案格式筆記 (以docker-compse 為例)

  • 分享至 

  • xImage
  •  

Presentation Model

1. YAML 簡介

(轉自Wiki)
YAML是"YAML Ain't a Markup Language"(YAML不是一種標記語言)的遞迴縮寫。
在開發的這種語言時,YAML的意思其實是:"Yet Another Markup Language"(仍是一種標記語言),但為了強調這種語言以資料為中心,而不是以標記語言為重點,而用反向縮略語重新命名。

所以到底是不是(頭好痛)
YAML 的基本特點

  • 易讀易寫
  • 支援複雜的資料結構
  • 可與多種程式語言整合
  • 使用縮排來表示結構

2. YAML 的基本語法

2.1 標量(Scalars)

字串: 'This is an apple'
數字: 42
布林值: true
空值: null
version: '3'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    restart: always

2.2 列表(Lists)

水果:
  - 蘋果
  - 香蕉
  - 橘子
services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
      - ./mysql-init-files:/docker-entrypoint-initdb.d

2.3 字典(Dictionaries)

使用者:
  名字: 小明
  年齡: 25
  興趣:
    - 閱讀 # 這裡是list
    - 游泳 # 這裡是list
services:
  web:
    environment:
      NODE_ENV: production
      DB_HOST: db
      DB_PORT: 3306

3. 進階 YAML 功能

3.1 錨點(Anchors)和別名(Aliases)

錨點和別名用於重複使用相同的資料,甚可以類似function一樣,先寫好,後面重複使用。
優點

  • 減少重複程式碼
  • 提高可維護性
  • 方便建立複雜的配置結構

3.1.0 概念介紹

  • 錨點(Anchor):使用 & 符號定義,用來標記一個值或一組值。
  • 別名(Alias):使用 * 符號引用,用來重複使用已經定義的錨點。

3.1.1 基本用法

# 定義錨點
基本設定: &基本
  版本: 1.0
  語言: 繁體中文

# 使用別名
使用者設定:
  <<: *基本  # 合併基本設定
  使用者名稱: 小明
x-base-service: &base-service #定義名為 base-service 的錨點
  restart: always
  logging:
    driver: json-file
    options:
      max-size: "10m"
      max-file: "5"

services:
  web:
    <<: *base-service #使用名為 base-service 的錨點
    image: nginx:latest
    ports:
      - "80:80"

  api:
    <<: *base-service #使用名為 base-service 的錨點
    image: node:14
    command: npm start

3.1.2 進階用法

部分覆蓋:

開發環境: &開發
  資料庫: MySQL
  快取: Redis
  除錯模式: 開啟

測試環境:
  <<: *開發  # 繼承開發環境設定
  除錯模式: 關閉  # 覆蓋特定設定
x-app-volume: &app-volume
  type: volume
  source: myapp
  target: /app

services:
  web:
    image: nginx:latest
    volumes:
      - <<: *app-volume
        read_only: true
  
  api:
    image: node:14
    volumes:
      - <<: *app-volume
        read_only: false

多重繼承:

資料庫設定: &資料庫
  類型: PostgreSQL
  端口: 5432

日誌設定: &日誌
  級別: 資訊
  格式: JSON

應用程式:
  <<: [*資料庫, *日誌]  # 合併多個設定
  名稱: 我的應用
x-logging: &logging
  logging:
    driver: json-file
    options:
      max-size: "10m"

x-healthcheck: &healthcheck
  healthcheck:
    test: ["CMD", "curl", "-f", "http://localhost"]
    interval: 1m30s
    timeout: 10s
    retries: 3

services:
  web:
    <<: [*logging, *healthcheck]
    image: nginx:latest

3.2 多行字串和換行處理

YAML 提供了幾種處理多行字串的方式,每種方式對換行的處理都不同:

3.2.1 保留換行符(|)

使用 | 可以保留文字塊中的換行:

描述: |
  這是一個
  多行字串。
  每一行都會保留。

services:
  app:
    image: myapp:latest
    command: |
      echo 'Starting application...'
      npm install
      npm start

這會保留每一行的換行。

3.2.2 折疊換行(>)

使用 > 可以將換行轉換為空格:

摘要: >
  這也是一個多行字串。
  但是換行會被轉換為空格。
  除非有空行分隔。
services:
  app:
    image: myapp:latest
    environment: >
      NODE_ENV=production
      DB_HOST=db
      DB_PORT=3306

這會將多行合併為一行,換行符會被轉換為空格。

3.2.3 保留換行但去除末尾換行(|-)

使用 |- 可以保留換行,但去除末尾的換行:

services:
  app:
    image: myapp:latest
    command: |-
      echo 'Starting application...'
      npm install
      npm start

這會保留換行,但不包括最後一行之後的換行。

4. YAML 的常見用途

  • 配置檔案
  • 資料序列化
  • 跨語言資料交換
  • 日誌檔案

5. YAML vs. JSON

YAML 通常被視為 JSON 的超集,提供更多功能和更好的可讀性。

6. 注意事項

  • 縮排對 YAML 語法至關重要,通常使用 2 個空格
  • 在 Docker Compose 中,服務名稱和鍵不能以數字開頭
  • 使用引號包裹包含特殊字元的字串

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言